package com.etooling.pdm.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.etooling.framework.entity.Employee;
import com.etooling.framework.jpa.JpaQueryBuilder;
import com.etooling.framework.jpa.Sorts;
import com.etooling.framework.jpa.Specifications;
import com.etooling.framework.svo.ReplyObj;
import com.etooling.framework.utils.WebUtils;
import com.etooling.pdm.entity.GoodsType;
import com.etooling.pdm.repository.GoodsTypeRepository;
import com.etooling.pdm.service.GoodsTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;

/**
 * @author dyz
 * @date 2023/5/17 12:00
 * @description GoodsTypeServiceImpl
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    private GoodsTypeRepository goodsTypeRepository;

    /**
     * 获取同公司，某个父类id的最大seq排序号，同时做好排序号自检
     *
     * @param parentId
     * @param companyId
     * @return
     */
    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public Integer getMaxSeq(String parentId, String companyId) {
        // 查询是不是有那个seq的数量有超过1个，代表这个seq重复了。
        List<Integer> list = goodsTypeRepository.checkSeq(parentId, companyId);
        if (list.size() > 0) {
            JpaQueryBuilder pb = Specifications.<GoodsType>and();
            pb.eq("parentId", parentId);
            pb.eq("companyId", companyId);
            pb.ne("status", GoodsType.STATUS_IS_DEL);
            Specification<GoodsType> spec = pb.build();
            Sort sort = Sorts.builder().asc("seq").build();
            List<GoodsType> typeList = goodsTypeRepository.findAll(spec, sort);
            int seq = 1;
            for (GoodsType type : typeList) {
                type.setSeq(seq++);
            }
            goodsTypeRepository.saveAll(typeList);
        }
        return goodsTypeRepository.getMaxSeq(parentId, companyId);
    }

    @Override
    public ReplyObj add(HttpServletRequest request, String json) {
        JSONObject jsonObject = JSON.parseObject(json);

        String typeCode = jsonObject.getString("typeCode");
        String parentId = jsonObject.getString("parentId");
        Boolean isProduct = jsonObject.getBoolean("isProduct");
        Boolean isComponents = jsonObject.getBoolean("isComponents");


        // 1. 判断编码是否唯一，同种产品类型(产品,物料)与同一父类下的编码需要唯一,
        Integer count = goodsTypeRepository.countTypeCode(typeCode, parentId, GoodsType.STATUS_IS_DEL, isProduct);
        if (count > 0) {
            return WebUtils.flushFailure("编码已经被占用，请更换编码");
        }

        GoodsType goodsType = new GoodsType();
        goodsType.setParentId(parentId);
        goodsType.setTypeCode(typeCode);
        goodsType.setIsProduct(isProduct);
        goodsType.setIsComponents(isComponents);

        String typeName = jsonObject.getString("typeName");
        goodsType.setTypeName(typeName);
        String companyId = WebUtils.getSessionValue(request, WebUtils.LOGIN_COMPANY_ID_KEY);
        goodsType.setCompanyId(companyId);
        String typeCodePath = jsonObject.getString("typeCodePath");
        goodsType.setTypeCodePath(typeCodePath);
        String typeNamePath = jsonObject.getString("typeNamePath");
        goodsType.setTypeNamePath(typeNamePath);


        // 2. 获取最大的seq，同时对seq进行自检
        Integer maxSeq = getMaxSeq(parentId, companyId);
        goodsType.setSeq(maxSeq + 1);

        goodsType.setStatus(GoodsType.STATUS_RUNNING);
        goodsType.setCreateTime(new Date());
        goodsType.setLastModifiedTime(new Date());

        String loginId = WebUtils.getSessionValue(request, WebUtils.LOGIN_USER_KEY);
        Employee creator = new Employee();
        creator.setId(loginId);
        goodsType.setCreator(creator);
        Employee modifier = new Employee();
        modifier.setId(loginId);
        goodsType.setModifier(modifier);

        goodsTypeRepository.save(goodsType);
        return WebUtils.flushSuccess(goodsType);
    }

    @Override
    public ReplyObj update(HttpServletRequest request, String json) {
        try {
            JSONObject jsonObject = JSON.parseObject(json);
            String id = jsonObject.getString("id");
            if (!WebUtils.checkStr(id)) {
                return WebUtils.flushFailure("操作过程中，找不到修改的对象，操作失败");
            }
            String typeCode = jsonObject.getString("typeCode");
            if (!WebUtils.checkStr(typeCode)) {
                return WebUtils.flushFailure("没有编码，请填写编码");
            }

            GoodsType goodsType = goodsTypeRepository.getOne(id);

            Boolean isProduct = jsonObject.getBoolean("isProduct");
            goodsType.setIsProduct(isProduct);

            Boolean isComponents = jsonObject.getBoolean("isComponents");
            goodsType.setIsComponents(isComponents);

            // 要修改的编码和旧编码是否不同，再看这个编码是不是已经被用过了
            if (!goodsType.getTypeCode().equals(typeCode)) {
                Integer count = goodsTypeRepository.countTypeCode(typeCode, goodsType.getParentId(), GoodsType.STATUS_IS_DEL, isProduct);
                if (count > 0) {
                    return WebUtils.flushFailure("编码已经被占用，请更换编码");
                }
                goodsType.setTypeCode(typeCode);
            }

            String typeName = jsonObject.getString("typeName");
            goodsType.setTypeName(typeName);

            String typeCodePath = jsonObject.getString("typeCodePath");
            goodsType.setTypeCodePath(typeCodePath);

            String typeNamePath = jsonObject.getString("typeNamePath");
            goodsType.setTypeNamePath(typeNamePath);

            String loginId = WebUtils.getSessionValue(request, WebUtils.LOGIN_USER_KEY);
            Employee modifier = new Employee();
            modifier.setId(loginId);
            goodsType.setModifier(modifier);
            goodsType.setLastModifiedTime(new Date());

            goodsTypeRepository.save(goodsType);
            return WebUtils.flushSuccess();
        } catch (Exception e) {
            e.printStackTrace();
            return WebUtils.flushFailure("操作过程中出现异常");
        }
    }

}
